package algorithm.linkedlist;

/**
 * 力扣203题:链表-根据值删除节点
 *
 * @author 杨 强
 * @package algorithm.linkedlist
 * @createTime 2023-03-12 17:11
 */
public class LC203 {
    public static void main(String[] args) {
        // 定义一个链表[1,2,3,4,5]
        ListNode o5 = new ListNode(5, null);
        ListNode o4 = new ListNode(4, o5);
        ListNode o3 = new ListNode(3, o4);
        ListNode o2 = new ListNode(2, o3);
        ListNode o1 = new ListNode(1, o2);
        System.out.println(o1);
        // 反转链表并返回头部节点
        ListNode n1 = recurrenceRemoveNodeByValue(o1, 2);
        System.out.println(n1);
    }


    /**
     * 根据值删除节点
     * @param head 链表头节点
     * @param value 值
     * @return 删除后的链表头节点
     */
    private static ListNode removeNodeByValue(ListNode head, int value){
        // 定义一个哨兵节点
        ListNode s = new  ListNode(-1, head);

        // 定义2个指针
        ListNode p1 = s;
        ListNode p2 = s.next;

        // 写循环进行比较
        while (p2 != null){
            if (p2.val == value){
                p1.next = p2.next;
                p2 = p2.next;
            }else {
                p1 = p1.next;
                p2 = p2.next;
            }
        }
        return s.next;
    }


    /**
     * 递归根据值删除节点
     * @param head 链表头节点
     * @param value 值
     * @return 删除后的链表头节点
     */
    private static ListNode recurrenceRemoveNodeByValue(ListNode head, int value){
        if (head == null){
            return null;
        }

        // 是需要删除的节点
        if (head.val == value){
            return recurrenceRemoveNodeByValue(head.next, value);
        }else {
            // 不是需要删除的节点
            head.next = recurrenceRemoveNodeByValue(head.next, value);;
            return head;
        }
    }
}
